﻿using System;

namespace ConsoleApp15
{
    class Program
    {
        static void Main(string[] args)
        {


            // 初始化Receiver、Invoke和Command
            Receiver receiver = new Receiver();
            Command command = new ConcreteCommand(receiver);
            Invoke invoker = new Invoke(command);
            invoker.ExecuteCommand();


        }
    }

    //Command对象作为Invoker的一个属性，当点击事件发生时，Invoker调用方法Invoke()将请求发送给ConcreteCommand，
    //再由ConcreteCommand调用Execute()将请求发送给Receiver，Client负责创建所有的角色，并设定Command与Invoker和Receiver之间的绑定关系。


    // Receiver：命令的接收者，知道如何实施与执行一个请求相关的操作
    public class Receiver
    {
        public void Execute()
        {
            Console.WriteLine("Called Receiver.Action()");
        }
    }


    // 命令抽象类  Command：命令抽象类，声明一个执行操作的接口Execute，该抽象类并不实现这个接口，所有的具体命令都继承自命令抽象类。
    public abstract class Command
    {
        // 命令应该知道接收者是谁，所以有Receiver这个成员变量
        protected Receiver _receiver;

        public Command(Receiver receiver)
        {
            this._receiver = receiver;
        }

        // 命令执行方法
        public abstract void Action();
    }



    //  ConcreteCommand：　 1：定义一个接收者对象与动作之间的请求绑定 ; 2：调用Receiver的操作，实现Execute方法
    public class ConcreteCommand : Command
    {
        public ConcreteCommand(Receiver receiver) : base(receiver) { }

        public override void Action()
        {
            // 调用接收的方法
            _receiver.Execute();
        }
    }


    // Invoker：命令的接收者，将命令请求传递给相应的命令对象，每个ConcreteCommand都是一个Invoker的成员
    public class Invoke
    {
        public Command _command;

        public Invoke(Command command)
        {
            this._command = command;
        }

        public void ExecuteCommand()
        {
            _command.Action();
        }
    }


}
